/**
 * Git仓库URL转换工具类
 * 
 * 主要功能：
 * 1. 将SSH格式的Git仓库URL转换为HTTP格式，以便在浏览器中访问
 * 2. 构建指向具体文件和行号的链接  
 * 3. 构建指向具体提交的链接
 * 4. 支持主流Git平台：GitHub、GitLab、Gitee等
 */

/**
 * Git仓库URL转换结果接口
 */
export interface GitUrlConversionResult {
  /** 转换后的HTTP URL */
  httpUrl: string;
  /** 原始URL */
  originalUrl: string;
  /** 是否进行了转换 */
  converted: boolean;
  /** Git平台类型 */
  platform: 'github' | 'gitlab' | 'gitee' | 'unknown';
  /** 仓库所有者/组织 */
  owner: string;
  /** 仓库名称 */
  repo: string;
}

/**
 * 将SSH格式的Git URL转换为HTTP格式
 * 
 * @param gitUrl - Git仓库URL（支持SSH和HTTP格式）
 * @returns 转换结果对象
 * 
 * @example
 * ```typescript
 * // SSH格式转换
 * convertSshToHttp('git@github.com:user/repo.git')
 * // 返回: { httpUrl: 'https://github.com/user/repo', converted: true, ... }
 * 
 * // 已经是HTTP格式
 * convertSshToHttp('https://github.com/user/repo.git')  
 * // 返回: { httpUrl: 'https://github.com/user/repo', converted: false, ... }
 * ```
 */
export function convertSshToHttp(gitUrl: string): GitUrlConversionResult {
  if (!gitUrl || typeof gitUrl !== 'string') {
    return {
      httpUrl: '',
      originalUrl: gitUrl || '',
      converted: false,
      platform: 'unknown',
      owner: '',
      repo: ''
    };
  }

  const trimmedUrl = gitUrl.trim();
  
  // 检测Git平台类型
  let platform: 'github' | 'gitlab' | 'gitee' | 'unknown' = 'unknown';
  if (/github\.com/i.test(trimmedUrl)) {
    platform = 'github';
  } else if (/gitlab/i.test(trimmedUrl)) {
    platform = 'gitlab';
  } else if (/gitee\.com/i.test(trimmedUrl)) {
    platform = 'gitee';
  }

  let httpUrl = '';
  let converted = false;
  let owner = '';
  let repo = '';

  // 处理SSH格式：git@platform.com:owner/repo.git
  const sshPattern = /^git@([^:]+):(.+)$/;
  const sshMatch = trimmedUrl.match(sshPattern);
  
  if (sshMatch) {
    const [, domain, path] = sshMatch;
    // 移除.git后缀
    const cleanPath = path.replace(/\.git$/i, '');
    // 根据需求使用 http 协议而不是 https
    httpUrl = `http://${domain}/${cleanPath}`;
    converted = true;
    
    // 解析owner和repo
    const pathParts = cleanPath.split('/');
    if (pathParts.length >= 2) {
      owner = pathParts[0];
      repo = pathParts[pathParts.length - 1];
    }
  } 
  // 处理HTTP/HTTPS格式：https://platform.com/owner/repo.git
  else if (/^https?:\/\//.test(trimmedUrl)) {
    // 移除.git后缀
    httpUrl = trimmedUrl.replace(/\.git$/i, '');
    converted = false;
    
    // 解析owner和repo
    try {
      const url = new URL(trimmedUrl);
      const pathParts = url.pathname.split('/').filter(part => part.length > 0);
      if (pathParts.length >= 2) {
        owner = pathParts[0];
        repo = pathParts[pathParts.length - 1].replace(/\.git$/i, '');
      }
    } catch (e) {
      console.warn('解析HTTP格式Git URL失败:', trimmedUrl, e);
    }
  }
  // 处理其他格式，尝试智能转换
  else {
    console.warn('未识别的Git URL格式:', trimmedUrl);
    httpUrl = trimmedUrl;
    converted = false;
  }

  return {
    httpUrl,
    originalUrl: trimmedUrl,
    converted,
    platform,
    owner,
    repo
  };
}

/**
 * 构建指向Git仓库中具体文件的链接
 * 
 * @param gitUrl - Git仓库URL
 * @param filePath - 文件路径
 * @param branch - 分支名称，默认为'master'
 * @param startLine - 起始行号（可选）
 * @param endLine - 结束行号（可选）
 * @returns 文件链接URL
 * 
 * @example
 * ```typescript
 * buildFileLink('git@github.com:user/repo.git', 'src/main.java', 'main', 10, 20)
 * // 返回: 'https://github.com/user/repo/blob/main/src/main.java#L10-L20'
 * ```
 */
export function buildFileLink(
  gitUrl: string,
  filePath: string,
  branch: string = 'master',
  startLine?: number,
  endLine?: number
): string {
  if (!gitUrl || !filePath) {
    return '';
  }

  const conversion = convertSshToHttp(gitUrl);
  if (!conversion.httpUrl) {
    return '';
  }

  const { httpUrl, platform } = conversion;
  
  // 规范化并编码文件路径
  const normalizedPath = filePath
    .replace(/\\/g, '/')
    .replace(/^\/+/, '')
    .split('/')
    .filter(segment => segment.length > 0)
    .map(encodeURIComponent)
    .join('/');

  // 不同平台的blob路径格式
  let blobPath = '';
  if (platform === 'gitlab') {
    blobPath = '/-/blob';
  } else {
    // GitHub、Gitee等使用 /blob
    blobPath = '/blob';
  }

  // 构建基础URL
  let fileUrl = `${httpUrl}${blobPath}/${encodeURIComponent(branch)}/${normalizedPath}`;
  
  // 添加行号锚点
  if (startLine) {
    if (endLine && endLine !== startLine) {
      // GitLab 格式：#L起始行-结束行（结束行不需要L前缀）
      fileUrl += `#L${startLine}-${endLine}`;
    } else {
      fileUrl += `#L${startLine}`;
    }
  }

  return fileUrl;
}

/**
 * 构建GitLab文件链接（兼容其他平台）
 * @param gitRepoUrl Git仓库URL
 * @param branch 分支名称
 * @param filePath 文件路径
 * @param startLine 起始行号
 * @param endLine 结束行号
 */
export function buildGitLabFileLink(
  gitRepoUrl: string,
  branch: string = 'master',
  filePath?: string,
  startLine?: number,
  endLine?: number
): string {
  if (!filePath) {
    return '';
  }
  return buildFileLink(gitRepoUrl, filePath, branch, startLine, endLine);
}

/**
 * 构建指向Git仓库中具体提交的链接
 * 
 * @param gitUrl - Git仓库URL
 * @param commitId - 提交ID
 * @returns 提交链接URL
 * 
 * @example
 * ```typescript
 * buildCommitLink('git@github.com:user/repo.git', 'abc123def')
 * // 返回: 'https://github.com/user/repo/commit/abc123def'
 * ```
 */
export function buildCommitLink(gitUrl: string, commitId: string): string {
  if (!gitUrl || !commitId) {
    return '';
  }

  const conversion = convertSshToHttp(gitUrl);
  if (!conversion.httpUrl) {
    return '';
  }

  const { httpUrl, platform } = conversion;
  
  // 不同平台的commit路径格式
  let commitPath = '';
  if (platform === 'gitlab') {
    commitPath = '/-/commit';
  } else {
    // GitHub、Gitee等使用 /commit
    commitPath = '/commit';
  }

  return `${httpUrl}${commitPath}/${commitId}`;
}

/**
 * 检测Git URL是否为SSH格式
 * 
 * @param gitUrl - Git仓库URL
 * @returns 是否为SSH格式
 */
export function isSshFormat(gitUrl: string): boolean {
  if (!gitUrl || typeof gitUrl !== 'string') {
    return false;
  }
  
  return /^git@[^:]+:.+/.test(gitUrl.trim());
}

/**
 * 检测Git URL是否为HTTP/HTTPS格式
 * 
 * @param gitUrl - Git仓库URL  
 * @returns 是否为HTTP格式
 */
export function isHttpFormat(gitUrl: string): boolean {
  if (!gitUrl || typeof gitUrl !== 'string') {
    return false;
  }
  
  return /^https?:\/\//.test(gitUrl.trim());
}

/**
 * 获取Git平台类型
 * 
 * @param gitUrl - Git仓库URL
 * @returns 平台类型
 */
export function getGitPlatform(gitUrl: string): 'github' | 'gitlab' | 'gitee' | 'unknown' {
  if (!gitUrl || typeof gitUrl !== 'string') {
    return 'unknown';
  }

  const trimmedUrl = gitUrl.trim().toLowerCase();
  
  if (trimmedUrl.includes('github.com')) {
    return 'github';
  } else if (trimmedUrl.includes('gitlab')) {
    return 'gitlab';
  } else if (trimmedUrl.includes('gitee.com')) {
    return 'gitee';
  }
  
  return 'unknown';
}

/**
 * 格式化文件路径为相对路径
 * 从绝对路径中提取相对于仓库根目录的路径
 * 
 * @param filePath - 文件路径（可能是绝对路径或相对路径）
 * @param repoName - 仓库名称（可选，用于更精确的定位）
 * @returns 相对路径
 * 
 * @example
 * ```typescript
 * formatRelativePath('/workspace/unitId/htsc-inst-activity-service/src/main/java/Main.java')
 * // 返回: 'htsc-inst-activity-service/src/main/java/Main.java'
 * 
 * formatRelativePath('/home/user/code-knowledge/src/main/java/Main.java', 'code-knowledge')
 * // 返回: 'src/main/java/Main.java'
 * ```
 */
export function formatRelativePath(filePath: string, repoName?: string): string {
  if (!filePath) {
    return '';
  }
  
  const normalized = filePath.replace(/\\/g, '/');
  
  // 1. 尝试通过仓库名定位相对路径
  if (repoName) {
    const marker = `/${repoName}/`;
    const repoIndex = normalized.lastIndexOf(marker);
    if (repoIndex >= 0) {
      return normalized.substring(repoIndex + marker.length);
    }
  }
  
  // 2. 尝试通过workspace路径定位（如 /workspace/unitId/）
  const workspacePattern = /\/workspace\/[^/]+\//;
  const workspaceMatch = normalized.match(workspacePattern);
  if (workspaceMatch) {
    const workspaceIndex = normalized.indexOf(workspaceMatch[0]);
    return normalized.substring(workspaceIndex + workspaceMatch[0].length);
  }
  
  // 3. 尝试通过 coderepo 路径定位（如 /home/appadmin/app/coderepo/xxx/）
  // 这种情况下，从 coderepo 后面的第二个目录开始算作项目根目录
  const coderepoPattern = /\/coderepo\/[^/]+\//;
  const coderepoMatch = normalized.match(coderepoPattern);
  if (coderepoMatch) {
    const coderepoIndex = normalized.indexOf(coderepoMatch[0]);
    return normalized.substring(coderepoIndex + coderepoMatch[0].length);
  }
  
  // 4. 尝试通过code-knowledge路径定位
  const codeKnowledgePattern = /\/code-knowledge[^/]*\//;
  const codeKnowledgeMatch = normalized.match(codeKnowledgePattern);
  if (codeKnowledgeMatch) {
    const codeKnowledgeIndex = normalized.indexOf(codeKnowledgeMatch[0]);
    return normalized.substring(codeKnowledgeIndex + codeKnowledgeMatch[0].length);
  }
  
  // 5. 如果路径已经是相对路径（不以/开头或以src/开头），直接返回
  if (!normalized.startsWith('/') || normalized.startsWith('src/')) {
    return normalized;
  }
  
  // 6. 移除开头的斜杠
  return normalized.startsWith('/') ? normalized.substring(1) : normalized;
}

// 导出默认的构建函数，兼容现有代码
export { buildFileLink as buildGitUrl };
